home *** CD-ROM | disk | FTP | other *** search
/ ADA Programming Guide / ADA Programming Guide.iso / ada_pcdp / ada / taskso.ada < prev    next >
Text File  |  1996-01-30  |  3KB  |  112 lines

  1. separate(MatrixO)
  2. task body Multiplier_Task is
  3.   North, East, South, West: Channels;
  4.   X, Sum, A: Integer;
  5. begin
  6.   accept Init(Coeff: Integer; T: Task_Ptr) do
  7.     A := Coeff;
  8.     North := T.North; East := T.East; 
  9.     South := T.South; West := T.West;
  10.     Channel(North).Destination(T, T.North);
  11.     Channel(East) .Destination(T, T.East);
  12.   end Init;
  13.   for N in 1..Size loop
  14.       accept Input(North)(I: in Integer) do
  15.         X := I;
  16.       end Input;
  17.       Channel(South).Output(X);
  18.       accept Input(East) (I: in Integer) do
  19.         Sum := I;
  20.       end Input;
  21.       Sum := Sum + A*X;
  22.       Channel(West).Output(Sum);
  23.   end loop;
  24. end Multiplier_Task;
  25.  
  26. separate(MatrixO)
  27. task body Source_Task is
  28.   South: Channels;
  29.   Vec: Vector;
  30. begin
  31.   accept Init(V: Vector; T: Task_Ptr) do
  32.     Vec := V;
  33.     South := T.South;
  34.   end Init;
  35.   for N in 1..Size loop
  36.     Channel(South).Output(Vec(N));
  37.   end loop;
  38. end Source_Task;
  39.  
  40. separate(MatrixO)
  41. task body Sink_Task is
  42.   North: Channels;
  43. begin
  44.   accept Init(T: Task_Ptr) do
  45.     North := T.North;
  46.     Channel(North).Destination(T, T.North);
  47.   end Init;
  48.   for N in 1..Size loop
  49.     accept Input(North)(I: in Integer);
  50.   end loop;
  51. end Sink_Task;
  52.  
  53. separate(MatrixO)
  54. task body Zero_Task is
  55.   West: Channels;
  56. begin
  57.   accept Init(T: Task_Ptr) do
  58.     West := T.West;
  59.   end Init;
  60.   for N in 1..Size loop
  61.     Channel(West).Output(0);
  62.   end loop;
  63. end Zero_Task;
  64.  
  65. with Text_IO; use Text_IO;
  66. separate(MatrixO)
  67. task body Result_Task is
  68.   East: Channels;
  69.   Ident: Integer;
  70. begin
  71.   accept Init(ID: Integer; T: Task_Ptr) do
  72.     Ident := ID;
  73.     East := T.East;
  74.     Channel(East).Destination(T, T.East);
  75.   end Init;
  76.   for N in 1..Size loop
  77.     accept Input(East)(I: in Integer) do
  78.       Put_Line(Integer'Image(Ident) & Integer'Image(N) &
  79.                Integer'Image(I));
  80.     end Input;
  81.   end loop;
  82. end Result_Task;
  83.  
  84. separate(MatrixO)
  85. task body Channel_Task is
  86.   T:  Task_Ptr;
  87.   Ch: Channels;
  88.   Save: Integer;
  89.   Invalid_Channel: exception;
  90. begin
  91.   accept Destination(T_Ptr: Task_Ptr; Chan: Channels) do
  92.     T  := T_Ptr;
  93.     Ch := Chan;
  94.   end Destination;    
  95.   loop
  96.     select
  97.       accept Output(I: in Integer) do
  98.         Save := I;
  99.       end Output;
  100.     or
  101.       terminate;
  102.     end select;
  103.     case T.Task_Type is
  104.       when Multiplier => T.M.Input(Ch)(Save);
  105.       when Source     => raise Invalid_Channel;
  106.       when Sink       => T.T.Input(Ch)(Save);
  107.       when Zero       => raise Invalid_Channel;
  108.       when Result     => T.R.Input(Ch)(Save);
  109.     end case;
  110.   end loop;
  111. end Channel_Task;
  112.